package model;

import drag.Construtora;
import controller.dialog.DialogPopUpMenu;
import java.util.ArrayList;
import java.util.List;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.control.Label;
import javafx.scene.effect.Reflection;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.stage.Screen;

/**
 * Classe que represaenta cada campo do tabuleiro e implementa todas operações a
 * ela delegadas
 */
public class Quadro extends AnchorPane implements EventHandler<MouseEvent> {

    private int id;//id do campo
    private GridPane gridPeoes;//grid que suporta as pessa no quadro
    private GridPane gridImoveis;// grid utilizado nos terrenos para suportar os imoveis
    private List<Pessa> peoes = new ArrayList<>();//Lista de peoes no quadro
    private List<ImageView> imoveis = new ArrayList<>();//lista de imoveis
    private String descricao = "";//descrição do campo
    private Label dono;//mostra o dono
    private boolean compravel; //define se o quadro é compravel
    private int casa = 0;//numero de casas

    public Quadro(int id, boolean compravel, String descricao, String image, boolean terreno) {
        this.id = id;
        this.compravel = compravel;
        this.descricao = descricao;
        Screen screen = Screen.getPrimary();
        Rectangle2D bounds = screen.getVisualBounds();

        setPrefSize((bounds.getWidth() - 10) / 10, (bounds.getHeight() - 200) / 4);

        /*Imagem do quadro*/
        ImageView img = new ImageView(image);
        img.setX((bounds.getWidth() - 10) / 20 - (img.getLayoutBounds().getWidth() / 2));
        img.setY(2);
        Reflection reflecao = new Reflection(0, 0.2, 0.15, 0);
        img.setEffect(reflecao);
        getChildren().add(img);

        /*Descrição do Quadro*/
        Label desc = new Label(descricao);
        desc.setTextAlignment(TextAlignment.CENTER);
        desc.setLayoutY(35);
        desc.setFont(new Font("Cambria", 12));
        desc.setLayoutX(5);
        desc.setWrapText(true);
        desc.setMaxWidth((bounds.getWidth() - 10) / 10 - 20);
        desc.setAlignment(Pos.CENTER);
        getChildren().add(desc);

        /*Define o label do dono no quadro*/
        dono = new Label();
        dono.setTextAlignment(TextAlignment.CENTER);
        dono.setLayoutY(35);
        dono.setFont(new Font("Cambria", 10));
        dono.setWrapText(true);
        dono.setAlignment(Pos.CENTER);
        dono.setLayoutX(20);
        dono.setStyle("-fx-font-weight: bold;");
        dono.setLayoutY((bounds.getHeight() - 200) / 4 - 20);
        dono.setMaxWidth((bounds.getWidth() - 20) / 10 - 20);
        getChildren().add(dono);

        /*Se o tipo do quadro é do tipo terreno cria as operações de Drag dop*/
        if (terreno) {
            gridImoveis = new GridPane();
            gridImoveis.setLayoutX((bounds.getWidth() - 10) / 20 - 30);
            gridImoveis.setLayoutY(2);
            getChildren().add(gridImoveis);

            //Costrutora das casas
            Construtora construtora = new Construtora(this);
            setOnDragOver(construtora.getDragOver());
            setOnDragEntered(construtora.getDragEntered());
            setOnDragExited(construtora.getDragExited());
            setOnDragDropped(construtora.getDragDropped());
            setOnDragDone(construtora.getDragDone());
        }

        //seta o id do AncePane pro css fazer a formatação
        setId("casa");

        /*Definir as propriedades do grid que suporta os peões*/
        gridPeoes = new GridPane();
        gridPeoes.setLayoutY(50);
        gridPeoes.setLayoutX(5);
        getChildren().add(gridPeoes);

        /*criar um listiner para eventos do mouse */
        setOnMouseClicked(this);
    }

    /**
     * Adicionar peões ao quadro
     */
    public void addPeao(Pessa p) {
        peoes.add(p);
        refress();
    }

    /**
     * Limpar os peoes
     */
    public void clear() {
        dono.setText("");
        peoes = new ArrayList<>();
        gridPeao();
        setCasa(0);
        imoveis = new ArrayList<>();
        refressImoveis();
    }

    /**
     * Elabora o grid de peões
     */
    private void gridPeao() {
        getChildren().remove(gridPeoes);
        gridPeoes = new GridPane();
        gridPeoes.setLayoutY(50);
        gridPeoes.setLayoutX(5);
        getChildren().add(gridPeoes);
    }

    /**
     * Elabora o grid de imoveis
     */
    public void gridImovel() {
        getChildren().remove(gridPeoes);
        gridPeoes = new GridPane();
        gridPeoes.setLayoutY(50);
        gridPeoes.setLayoutX(5);
        getChildren().add(gridPeoes);
    }

    /**
     * Remontar os peões graficamente no quadro
     */
    public void refress() {
        int l = 0, c = 0;
        gridPeao();
        for (int i = 0; i < peoes.size(); i++) {
            if (c == 3) {
                l = 1;
                c = 0;
            }
            gridPeoes.add(peoes.get(i), c, l);
            c++;
        }
    }

    /**
     * Listener no evento de click do mouse no campo
     */
    @Override
    public void handle(MouseEvent event) {
        if (event.getButton() == MouseButton.PRIMARY) {
            if (compravel && !dono.getText().isEmpty()) {
                if (!getDono().equals(TAGS.NAME)) {
                    DialogPopUpMenu.getIntancia().show(id, descricao);
                }
            }
        }
    }

    /**
     * Adicionar o numero de casa do quadro
     */
    public void addImovel(int casa) {
        setCasa(casa);
        imoveis = new ArrayList<>();
        for (int i = 0; i < casa; i++) {
            ImageView imovel = new ImageView("/resource/companies/casa.png");
            imovel.setFitHeight(13);
            imovel.setFitWidth(13);
            imoveis.add(imovel);
        }
        refressImoveis();
    }

    /**
     * Atualizar a lista de imoveis gráficamente
     */
    public void refressImoveis() {
        Screen screen = Screen.getPrimary();
        Rectangle2D bounds = screen.getVisualBounds();
        getChildren().remove(gridImoveis);
        gridImoveis = new GridPane();
        gridImoveis.setLayoutX((bounds.getWidth() - 10) / 20 - 30);
        gridImoveis.setLayoutY(2);
        getChildren().add(gridImoveis);

        int l = 0, c = 0;

        for (int i = 0; i < imoveis.size(); i++) {
            if (getCasa() == 5) {
                ImageView hotel = new ImageView("/resource/companies/hotel.png");
                hotel.setFitHeight(30);
                hotel.setFitWidth(30);
                gridImoveis.add(hotel, 0, 0);
            } else {
                if (c == 2) {
                    l = 1;
                    c = 0;
                }
                gridImoveis.add(imoveis.get(i), c, l);
                c++;
            }
        }
    }

    public int getCampoPosition() {
        return id;
    }

    public void setCasa(int casa) {
        this.casa = casa;
    }

    public int getCasa() {
        return casa;
    }

    public String getDescricao() {
        return descricao;
    }

    public String getDono() {
        return dono.getText().replace("Dono: ", "");
    }

    public void setDono(String dono) {
        this.dono.setText("Dono: " + dono);
    }
}
